//
//  "$Id: VideoDetect.h 2057 2008-10-24 08:27:01Z wang_haifeng $"
//
//  Copyright (c)1992-2007, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:	所有坐标点和尺寸按照帧画面的绝对坐标系，分辨率变化后
//					相关参数需要重新设置
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __MASTER_SLAVE_TRACKER_API_H__
#define __MASTER_SLAVE_TRACKER_API_H__

#include "Types.h"
#include "Defs.h"


#ifdef __cplusplus
extern "C" {
#endif

	/// \defgroup MasterSlaveTracker API 
	///  主从式跟踪器接口
	///	\n 调用流程图:
	/// \code
	///    ===========================
	///                |
	///        *createMasterSlaveTracker
	///                |
	///             addRef
	///                |
	///              start
	///                |
	///                |\--------------+
	///        +------\|               |
	///        |  setTrackingMode    set,get and so on...
	///        +------/|               |
	///                |/--------------+
	///				  stop
	///                |	
	///             release
	///                |
	///    ===========================
	/// \endcode
	/// @{
	

	/// 变倍类型
	typedef enum MasterSlaveTrackerZoomType
	{
		masterSlaveTrackerZoomTypeStationaryExpectMultiple	= 0,	///< 固定期望倍数变倍
		masterSlaveTrackerZoomTypeIVSAdaptive				= 1,	///< 根据ivs输出自适应变倍
		masterSlaveTrackerZoomTypeExpectMultipleAdaptive	= 2,	///< 数自适应变倍		

		//根据相机设置高度自适应变倍
	} MasterSlaveTrackerZoomType;


	/// 跟踪模式
	typedef enum MasterSlaveTrackerTrackingMode
	{
		masterSlaveTrackerTrackingModeManual		= 0,			///< 手动选定目标 //"ManualSelectObjectTrack" 手动选定物体跟踪
		masterSlaveTrackerTrackingModeAutomatic		= 1,			///< 自动选定目标 //"AutomaticSelectObjectTrack" 自动选定物体跟踪
		masterSlaveTrackerTrackingModeAlarm			= 2,			///< 智能报警跟踪		
		masterSlaveTrackerTrackingModeSelectPoint	= 3,			///< 定点跟踪
		masterSlaveTrackerTrackingModeMix			= 4,			///< 混合跟踪
		masterSlaveTrackerTrackingModeSlaveCameraSelfControl	= 5, ///< 球机自主控制
	} MasterSlaveTrackerTrackingMode;


	/*相机控制*/
	typedef enum MasterSlaveTrackerPtzControlCmdType
	{
		masterSlaveTrackerPtzControlCmdTypeInit			= 0,	///< PTZ_CTRL_INIT				= 0,	//初始状态
		masterSlaveTrackerPtzControlCmdTypePrepareTrack	, 		///< PTZ_CTRL_PRE_TRACK			   ,	//预跟踪	  
		masterSlaveTrackerPtzControlCmdTypeStop			, 		///< PTZ_CTRL_STOP				   ,	//球机停止
		masterSlaveTrackerPtzControlCmdTypeMoveTo		,		///< PTZ_CTRL_MOVE_TO			   ,	//球机移动到坐标点
		masterSlaveTrackerPtzControlCmdTypeMoveSpeed	,		///< PTZ_CTRL_MOVE_DIRECT		   ,	//指定运动速度
		masterSlaveTrackerPtzControlCmdTypeBackToPreset	,		///< PTZ_CTRL_BACK_TO_POS		   ,	//球机返回预置点
		masterSlaveTrackerPtzControlCmdTypeZooIn		,		///< PTZ_CTRL_ZOOM_IN			   ,	//球机变倍+
		masterSlaveTrackerPtzControlCmdTypeOut			,		///< PTZ_CTRL_ZOOM_OUT			   ,	//球机变倍-	
		masterSlaveTrackerPtzControlCmdTypeFastLocate	,		///< PTZ_CTRL_FAST_LOCATE		   ,	//球机快速定位，用于初定位
		masterSlaveTrackerPtzControlCmdTypeZoomAndMove	,		///< PTZ_CTRL_ZOOM_MOVE			   ,	//移动同时变倍
		masterSlaveTrackerPtzControlCmdTypeZoomAndSpeed	,		///<PTZ_CTRL_ZMOVE_DIRECT		   ,	//指定运动速度，同时变倍
		masterSlaveTrackerPtzControlCmdTypeKeep			,		///< PTZ_CTRL_KEEP						//保持当前状态
		//......
	}MasterSlaveTrackerPtzControlCmdType;


	//云台控制参数, 64字节；
	typedef struct MasterSlaveTrackerPtzControlCmd
	{			
		MasterSlaveTrackerPtzControlCmdType	cmd : 8;//球机控制指令
		int reservedBits : 24;				///< 保留位
		int angleX;							//球机角度x
		int angleY;							//球机角度y
		int speedX;							//球机速度矢量x
		int speedY;							//球机速度矢量y
		int prepareX;						//预测位置x
		int prepareY;						//预测位置y
		int zoomMultiple;					//球机变倍倍数，-1表示保持之前状态，如果发出返回预置点指令，该参数无效
		int speedChangeSign : 4;			///< 球机精确追踪速度切换标记	 0 原状， 1-切换
		int	reservedBits2 : 28;				///< 保留位	
		int reserved[7];					///< 保留
	}MasterSlaveTrackerPtzControlCmd;



	/// 跟踪物体信息, 128字节
	typedef struct MasterSlaveTrackerObject
	{
		int 		id;				///< id -1 表示web上框选的是智能帧上传框外任意位置物体，>=0表示框选的是智能帧上传的物体
		Rect		boundingBox;	///< 包围盒, 矩形类型，点的坐标归一化到[0,8191]区间
		int			reserved[27];	///< 保留
	} MasterSlaveTrackerObject;

/* 删除,获取跟踪命令，用get;
	typedef enum MasterSlaveTrackerCallbackCmdType
	{
		masterSlaveTrackerCallbackCmdTypeAutoTrack = 0, ///< 自动跟踪命令, 回调函数,data对应的数据结构为MasterSlaveTrackerPtzControlCmd

	}MasterSlaveTrackerCallbackCmdType;
	
	// 主从式跟踪器回调接口
	typedef int (*MasterSlaveTrackerCallback)(MasterSlaveTrackerCallbackCmdType cmd, void * data);
*/
	/// 主从式跟踪器接口，256字节
	typedef struct MasterSlaveTracker
	{
		/// 底层私有数据
		void *priv;


		/// 增加接口引用
		int (*addRef)(struct MasterSlaveTracker *thiz);


		/// 释放接口
		int (*release)(struct MasterSlaveTracker *thiz);


		/// 开始工作。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \retval 0  开始成功
		/// \retval <0  开始失败
		int (*start)(struct MasterSlaveTracker *thiz);


		/// 停止工作。
		/// 
		/// \param [in]  thiz 主从式跟踪器接口指针
		/// \retval 0  停止成功
		/// \retval <0  停止失败
		int (*stop)(struct MasterSlaveTracker *thiz);

		/// 设置变倍类型。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [in] type 变倍类型		
		/// \retval 0  成功
		/// \retval <0 失败
		int (*setZoomType)(struct MasterSlaveTracker *thiz, MasterSlaveTrackerZoomType type);

		/// 设置最大变倍倍数。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [in] zoom 最大变倍倍数
		/// \retval 0  成功
		/// \retval <0  失败
		int (*setMaxZoom)(struct MasterSlaveTracker *thiz, int zoom);


		/// 设置最小变倍倍数。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [in] zoom 最大变倍倍数
		/// \retval 0  成功
		/// \retval <0 失败
		int (*setMinZoom)(struct MasterSlaveTracker *thiz, int zoom);
		
		/// 设置跟踪模式。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [in] mode 跟踪模式
		/// \retval 0  成功
		/// \retval <0  失败
		int (*setTrackingMode)(struct MasterSlaveTracker *thiz, MasterSlaveTrackerTrackingMode mode);
		
		/// 设置轮询跟踪时长。报警跟踪 自动跟踪 混合跟踪 三种跟踪模式有效
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [in] timeLength 轮询时长
		/// \retval 0  成功
		/// \retval <0  失败
		int (*setPollTrackTime)(struct MasterSlaveTracker *thiz, float timeLength);


		/// 设置相机期望倍数。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [in] expectMultiple 期望倍数
		/// \param [in] expectMultipleEngleX 期望倍数对应球机角度x（水平）
		/// \param [in] expectMultipleEngleY 期望倍数对应球机角度y（垂直）
		/// \retval 0  成功
		/// \retval <0  失败
		int (*setExpectMultiple)(struct MasterSlaveTracker *thiz, int expectMultiple, int expectMultipleEngleX, int expectMultipleEngleY);
			
		/// 设置标定矩阵参数。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [in] calibrateMatrix 标定矩阵数据
		/// \param [in] matrixSize 标定矩阵尺寸		
		/// \retval 0  成功
		/// \retval <0  失败
		int (*setCalibrateMatrix)(struct MasterSlaveTracker *thiz, unsigned char * calibrateMatrix, int matrixSize);


		/// 定点跟踪。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [in] point 跟踪坐标		
		/// \param [out] cmd 从摄像机云台命令
		/// \param [in] delay 跟踪时长，单位秒；	
		/// \retval 0  成功
		/// \retval <0  失败
		int (*selectPointTrack)(struct MasterSlaveTracker *thiz, Point point,  MasterSlaveTrackerPtzControlCmd * cmd, float delay);
		

		/// 手动选定目标跟踪。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [in] point 跟踪坐标
		/// \param [in] object 跟踪物体		
		/// \param [in] delay 跟踪时长，单位秒；		
		/// \retval 0  成功
		/// \retval <0  失败
		int (*manualSelectObjectTrack)(struct MasterSlaveTracker *thiz, MasterSlaveTrackerObject * object, float delay);

		


		/// 得到跟踪结果（自动、选定目标跟踪下）
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [in] point 跟踪坐标
		/// \param [in] object 跟踪物体		
		/// \retval 0  成功
		/// \retval <0  失败
		int (*getTrackCommand)(struct MasterSlaveTracker *thiz, MasterSlaveTrackerPtzControlCmd * cmd);

		/// 标定。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [in] point 跟踪坐标
		/// \param [in] masterPoints 主摄像机像素坐标
		/// \param [in] slavePoints 从摄像机云台坐标
		/// \param [in] pointCount  坐标点组数；一个主摄像机像素坐标和一个从摄像机云台坐标是为一组
		/// \param [out] calibrateMatrix 标定矩阵数据，数据长度不超过128字节；
		/// \param [out] matrixSize 标定矩阵尺寸,输出为实际数据长度；
		/// \retval 0  成功
		/// \retval <0  失败
		int (*calibrate)(struct MasterSlaveTracker *thiz, Point * masterPoints, Point * slavePoints, int pointCount, unsigned char * calibrateMatrix, int *matrixSize);



		/* 删除以下函数接口
		/// 标定。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针		
		/// \retval 0  成功
		/// \retval <0  失败
		int (*calibrate)(struct MasterSlaveTracker *thiz);
		

		/// 获取标定点数量。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [out] count 已标定点数量
		/// \retval 0  成功
		/// \retval <0  失败
		int (*getCalibratePointCount)(struct MasterSlaveTracker *thiz);
		

		/// 获取标定点。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [out] points 标定点
		/// \retval 0  成功
		/// \retval <0  失败
		int (*getCalibratePoints)(struct MasterSlaveTracker *thiz, Point *points);
		

		/// 增加标定点。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [in] point 标定点
		/// \retval 0  成功
		/// \retval <0  失败
		int (*addCalibratePoint)(struct MasterSlaveTracker *thiz, Point point);
		

		/// 删除标定点。
		/// 
		/// \param [in] thiz 主从式跟踪器接口指针
		/// \param [in] points 标定点
		/// \retval 0  成功
		/// \retval <0  失败
		int (*removeCalibratePoint)(struct MasterSlaveTracker *thiz, Point point);	
*/

		///< 保留
		void* reserved[48];

	} MasterSlaveTracker;


	/// 得到主从式跟踪器组数
	int getMasterSlaveTrackerChannels(void);


	/// 主从式跟踪器接口描述，128字节
	typedef struct MasterSlaveTrackerDesc
	{
		int	channel;		///< 主从式跟踪器通道号		

		//图像宽、高
		int imageWidth;							//图像宽
		int imageHeight;						//图像高
		int foregroundImageWidth;				//前景图像宽
		int foregroundImageHeight;						//前景图像高
		//相机参数，值放大1024倍
		int minFocus;							//最小焦距
		int maxFocus;							//最大焦距
		int targetFaceVerticalSize;				//靶面垂直尺寸
		int targetFaceHorizontalSize;			//靶面水平尺寸
		//期望倍数设置
		//int expectMultipleEngleX;				//期望倍数对应球机角度x（水平）
		//int expectMultipleEngleY;				//期望倍数对应球机角度y（垂直）
		//int expectBenchmarkMultiple;			//期望倍数设置（基准倍数）
		//球机倍数表
		int *zoomList;							//倍数表
		int *zoomTimeList;						//变倍时间间隔表
		int zoomListSize;						//变倍表大小
		//MasterSlaveTrackerCallback * callback;	///< 回调函数指针，无需回调时，传NULL空值；
		int	reserved[20];	///< 保留
	} MasterSlaveTrackerDesc;


	/// 创建主从式跟踪器接口
	///
	/// \param [in] dest 主从式跟踪器接口描述结构VideoAnalyseDesc指针
	/// \param [out] MasterSlaveTracker 主从式跟踪器指针的指针
	/// \retval <0 创建失败
	/// \retval 0 创建成功
	int PAL_API createMasterSlaveTrackerDesc(MasterSlaveTrackerDesc *desc, MasterSlaveTracker **videoAnalyser);


	/// @} end of group

#ifdef __cplusplus
}
#endif

#endif //__MASTER_SLAVE_TRACKER_API_H__
